package org.xqp.hrm.service.impl;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.xqp.hrm.constants.BaseConstants;
import org.xqp.hrm.constants.ErrorCode;
import org.xqp.hrm.domain.Employee;
import org.xqp.hrm.domain.Login;
import org.xqp.hrm.domain.Tenant;
import org.xqp.hrm.dto.LoginMealDto;
import org.xqp.hrm.dto.TenantRegisterDto;
import org.xqp.hrm.feign.client.LoginFeignClient;
import org.xqp.hrm.mapper.TenantMapper;
import org.xqp.hrm.service.IEmployeeService;
import org.xqp.hrm.service.ITenantService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.xqp.hrm.util.AjaxResult;
import org.xqp.hrm.util.AssertUtil;

import java.util.Date;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author xqp
 * @since 2021-11-21
 */
@Service
public class TenantServiceImpl extends ServiceImpl<TenantMapper, Tenant> implements ITenantService {

    @Autowired
    private LoginFeignClient loginFeignClient;

    @Autowired
    private IEmployeeService employeeService;

    /**
     * 机构入驻
     *
     * 保存login表，机构表，员工表。机构套餐中间表
     * @param dto
     */
    @Override
    @Transactional(rollbackFor = {Exception.class}) // 事务里的rollbackFor = {Exception.class}意思是遇到异常直接回滚
    public void entering(TenantRegisterDto dto) {
        Employee employee = dto.getEmployee();
        Login login = dto.getLogin();
        Tenant tenant = dto.getTenant();
        Long mealId = dto.getMealId();
//        if(StringUtils.isEmpty(login.getUsername())){
////            throw new RuntimeException("用户名不可以为空");
////        }
////        if(StringUtils.isEmpty(login.getPassword())){
////            throw new RuntimeException("密码不可以为空");
////        }
////        if(StringUtils.isEmpty(tenant.getCompanyName())){
////            throw new RuntimeException("公司名不可以为空");
////        }
        //d断言工具报错写法以及错误码的封装
        AssertUtil.isEmpty(login.getUsername(), ErrorCode.LOGIN_USERNAME_IS_NULL.getFullMessage());
        AssertUtil.isEmpty(login.getPassword(), ErrorCode.LOGIN_PASSWORD_IS_NULL.getFullMessage());
        AssertUtil.isEmpty(tenant.getCompanyName(), ErrorCode.TENANT_NAME_IS_NULL.getFullMessage());

        // feign远程调用保存Login表,保存Login和套餐中间表
        LoginMealDto loginMealDto = new LoginMealDto();
        login.setType(BaseConstants.Login.TYPE_SYSTEM);
        loginMealDto.setLogin(login);
        loginMealDto.setMealId(mealId);
        AjaxResult ajaxResult = loginFeignClient.saveLoginAndMeal(loginMealDto); // 获取到保存后返回给我们的AjaxResult
        if (!ajaxResult.isSuccess() || ajaxResult.getResultObj() == null){ // 判断方法是保存成功还是走了降级方法，还是没有将数据返回给我
            throw new RuntimeException("保存失败");
        }
        // 获取到保存Login成功后的 loginId
        Long loginId = Long.valueOf(ajaxResult.getResultObj().toString()); // 先转换为字符串在转换为Long

        // 保存管理员Employee
        Employee emp = new Employee();
        // 邮箱
        emp.setEmail(employee.getEmail());
        // 电话
        emp.setTel(employee.getTel());
        // 外键登录LoginID
        emp.setLoginId(loginId);
        // 注册时间
        emp.setInputTime(new Date());
        // 机构管理员
        emp.setType(BaseConstants.Employee.TYPE_TENANT_ADMIN);
        employeeService.insert(emp);

        // 保存机构
        tenant.setRegisterTime(new Date());// 时间
        tenant.setState(BaseConstants.Tenant.STATE_WAIT_AUDIT); // 状态待审核
        tenant.setAdminId(emp.getId());
        baseMapper.insert(tenant);
    }
}
